home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / 3DDEMO.ZIP / 3D / SOURCE / VOXELOW.ASM < prev   
Assembly Source File  |  1996-07-16  |  11KB  |  382 lines

  1.  
  2. ;  Copyright (c) 1996 by Kerrigan Burgess, all rights reserved.
  3.  
  4.         .486
  5.         
  6.         ASSUME  CS:_TEXT
  7.         ASSUME  DS:_DATA
  8.  
  9.                 _SCREENWIDTH      EQU 80         ; 320/4         
  10.                 _SCREENW          EQU 320  
  11.                 _SCREENH          EQU 200 
  12.                 _SCREENSIZE       EQU 64000
  13.                 _SHADOWSTART      EQU 127        ; for a Shadow of width 64
  14.                 _SHADOWEND        EQU 193
  15.                 
  16. ; export Functions
  17.  
  18.                 PUBLIC GetOffset
  19.                 PUBLIC GetOffset2
  20.                 PUBLIC RenderSkyLine
  21.                 PUBLIC CastRay
  22.  
  23. ; export data
  24.                 
  25.                 PUBLIC _Skymap
  26.                 PUBLIC _Colormap
  27.                 PUBLIC _Heightmap
  28.                 PUBLIC _ShadowmapPtr
  29.                 PUBLIC _ShadowPAL
  30.                 PUBLIC _Buffer    
  31.                 PUBLIC _SKYHEIGHT
  32.                 PUBLIC _SkyHoriz  
  33.                 PUBLIC _SkyLimit    
  34.                 PUBLIC _LeftCos    
  35.                 PUBLIC _LeftSin   
  36.                 PUBLIC _RightCos  
  37.                 PUBLIC _RightSin    
  38.                 PUBLIC _vx
  39.                 PUBLIC _vy 
  40.                 PUBLIC _x
  41.                 PUBLIC _y
  42.                 PUBLIC _z
  43.                 PUBLIC _dx
  44.                 PUBLIC _dy
  45.                 PUBLIC _dz
  46.                 PUBLIC _col
  47.                 PUBLIC _kVScale
  48.         
  49. _DATA           SEGMENT 'DATA' USE32
  50.  
  51. ; Export data         
  52.                 _Skymap         dd 0
  53.                 _Colormap       dd 0
  54.                 _Heightmap      dd 0
  55.                 _ShadowmapPtr   dd 0
  56.                 _ShadowPAL      dd 0
  57.                 _Buffer         dd 0
  58.                 _SKYHEIGHT      dd 0
  59.                 _SkyHoriz       dd 0
  60.                 _SkyLimit       dd 0
  61.                 _LeftCos        dd 0
  62.                 _LeftSin        dd 0
  63.                 _RightCos       dd 0
  64.                 _RightSin       dd 0
  65.                 _vx             dd 0
  66.                 _vy             dd 0             
  67.                 _x              dd 0
  68.                 _y              dd 0
  69.                 _z              dd 0
  70.                 _dx             dd 0
  71.                 _dy             dd 0
  72.                 _dz             dd 0
  73.                 _col            dd 0
  74.                 _kVScale        dd 0
  75.         
  76. ; Local to module
  77.     
  78.                 _Dist           dd 0
  79.                 _row            dd 0
  80.                 _color          dd 0
  81.                 _depth          dd 0
  82.                 _pixel          dd 0
  83.                 _u0             dd 0
  84.                 _v0             dd 0
  85.                 _u1             dd 0
  86.                 _v1             dd 0
  87.                 _Du             dd 0
  88.                 _Dv             dd 0
  89.                 _shadowoffset   dd 0
  90.                 _DEPTHCLIP      dd 0
  91.                 _SCANLINELENGTH dd 204   ; 16:16 fixed point
  92.                                     
  93. _DATA           ENDS
  94.                         
  95. _TEXT           SEGMENT PUBLIC 'CODE' USE32
  96.  
  97. GetOffset  PROC    NEAR
  98.                mov ebx,edx
  99.                shr ebx,23
  100.                shld ebx,ecx,9
  101.            cld    
  102.            ret
  103. GetOffset  ENDP
  104.  
  105. GetOffset2 PROC    NEAR
  106.                mov ebx,edx
  107.                shr ebx,24
  108.                shld ebx,ecx,8
  109.            cld    
  110.            ret
  111. GetOffset2 ENDP
  112.  
  113. RenderSkyLine PROC NEAR
  114.  
  115.               push esi
  116.           push edi
  117.           push ebp
  118.                     
  119.               mov edi,_Buffer                         
  120.               mov esi,_Skymap   
  121.           
  122.               jmp $+2               ; clear prefetch queue
  123.  
  124.               mov _row,0
  125. @@DoSky:          
  126.               mov eax,_SKYHEIGHT
  127.               mov ebx,_SkyHoriz
  128.               sub ebx,_row
  129.           cdq
  130.           div ebx
  131.           mov ebx,eax         ; save Dist
  132.               mov eax,_LeftCos
  133.           cdq
  134.               imul ebx
  135.               add eax,_vx             
  136.           mov ecx,eax         
  137.               mov eax,_RightCos
  138.           cdq
  139.           imul ebx
  140.               add eax,_vx
  141.           sub eax,ecx         ; holds Du
  142.           sar eax,8           ; get in 24:8 format
  143.               cdq
  144.               imul _SCANLINELENGTH ; normalized to 24:8 format
  145.               mov _Du,eax
  146.               mov eax,_LeftSin
  147.           cdq
  148.               imul ebx
  149.               add eax,_vy
  150.           mov ebp,eax
  151.               mov eax,_RightSin
  152.           cdq
  153.           imul ebx
  154.               add eax,_vy
  155.           sub eax,ebp
  156.           sar eax,8
  157.           cdq
  158.               imul _SCANLINELENGTH    ; normalized to 24:8 format
  159.               mov _Dv,eax
  160.           sal ecx,8           ; normalize u0 and u1 to 8:24 format
  161.               sal ebp,8
  162.           mov edx,ebp          
  163.                         
  164.               mov ebp,_SCREENWIDTH   ; inner for loop                                         
  165.  
  166. @@DoScanLine:
  167.  
  168.               mov ebx,edi            ; get 64 bits of edi in active cache
  169.  
  170.               mov ebx,edx
  171.           shr ebx,24
  172.           shld ebx,ecx,8          
  173.           mov al,BYTE PTR [ esi+ebx ]
  174.               add ecx,_Du            ; u0+=Du
  175.               add edx,_Dv            ; v0+=Dv  
  176.                         
  177.               mov ebx,edx
  178.           shr ebx,24
  179.           shld ebx,ecx,8          
  180.           mov ah,BYTE PTR [ esi+ebx ]
  181.               add ecx,_Du            ; u0+=Du
  182.               add edx,_Dv            ; v0+=Dv  
  183.           
  184.               bswap eax                                  
  185.  
  186.               mov ebx,edx
  187.           shr ebx,24
  188.           shld ebx,ecx,8          
  189.           mov ah,BYTE PTR [ esi+ebx ]
  190.               add ecx,_Du            ; u0+=Du
  191.               add edx,_Dv            ; v0+=Dv  
  192.          
  193.               mov ebx,edx
  194.           shr ebx,24
  195.           shld ebx,ecx,8          
  196.           mov al,BYTE PTR [ esi+ebx ]
  197.               add ecx,_Du            ; u0+=Du
  198.               add edx,_Dv            ; v0+=Dv  
  199.  
  200.               bswap eax         
  201.               mov [edi],eax          ; slap to buffer
  202.               add edi,4
  203.  
  204.               dec ebp
  205.           jnz @@DoScanLine                             
  206.               inc _row
  207.               mov ebp,_row
  208.               cmp ebp,_SkyLimit
  209.           jl @@DoSky
  210.           
  211.           pop ebp
  212.           pop edi
  213.           pop esi
  214.               
  215.           cld          
  216.           ret
  217.           
  218. RenderSkyLine ENDP
  219.           
  220. CastRay PROC NEAR
  221.  
  222.               push esi
  223.           push edi
  224.           push ebp
  225.  
  226.               mov eax,_kVScale
  227.           shl eax,8
  228.               mov _DEPTHCLIP,eax
  229.  
  230.               mov eax,_SCREENSIZE
  231.               sub eax,_SCREENW
  232.               add eax,_col
  233.               mov _pixel,eax
  234.               mov esi,_Heightmap   
  235.  
  236.               mov eax,_col            
  237.               cmp eax,_SHADOWSTART
  238.           jle @@NoShadow
  239.               cmp eax,_SHADOWEND
  240.           jge @@NoShadow
  241.                                          ; in shadow
  242.           
  243.               jmp $+2                     ; clear prefetch queue
  244.  
  245.               sub eax,_SHADOWSTART
  246.               mov _shadowoffset,eax
  247.               mov eax,_x                 ; x
  248.               mov ebx,_y                 ; y
  249.               mov ecx,_z                 ; z
  250.           xor edx,edx                ; ph
  251.               mov _depth,-1  
  252.  
  253. @@DoSliver:                        
  254.               cmp edx,_DEPTHCLIP      
  255.           jge @@TheEnd        
  256.               add eax,_dx
  257.               add ebx,_dy
  258.               add ecx,_dz
  259.               add edx,_kVScale
  260.           add _depth,1
  261.           mov ebp,ebx
  262.           shr ebp,23
  263.           shld ebp,eax,9
  264.           mov edi,[ esi+ebp*4 ]
  265.           cmp edi,ecx
  266.           jle @@DoSliver
  267.               push esi                        ; need register --> if only intel had more!
  268.           push ebx               
  269.           push eax                       
  270.           xor ebx,ebx
  271.               mov esi,_Colormap   
  272.           mov bl,BYTE PTR [ esi+ebp ]             ; ebx holds color
  273.               mov ebp,_depth
  274.           shl ebp,6
  275.               add ebp,_shadowoffset
  276.               mov esi,_ShadowmapPtr
  277.           xor eax,eax
  278.           mov al,BYTE PTR [ esi+ebp ]
  279.                shl ebx,1
  280.           add eax,ebx
  281.               mov esi,_ShadowPAL    
  282.           mov bl, BYTE PTR [ esi+eax ]             
  283.           mov ebp,edi                      ; ebx holds height
  284.               mov edi,_Buffer   
  285.               mov esi,_pixel
  286.               mov eax,_dz
  287.                               
  288. @@ReplicateColor:                                   
  289.  
  290.               add eax,_kVScale                 ; dz+=kVScale
  291.               mov BYTE PTR [ edi+esi ],bl          
  292.               add ecx,edx                      ; z+=ph
  293.               sub esi,_SCREENW                 ; pixel-=SCREENWIDTH     
  294.               cmp esi,0
  295.           jge  @@PassOver
  296.               pop eax
  297.           pop ebx
  298.           pop esi
  299.           jmp @@TheEnd
  300.           
  301. @@PassOver:
  302.           
  303.               cmp ebp,ecx
  304.               jg  @@ReplicateColor              
  305.               mov _dz,eax
  306.               mov _pixel,esi
  307.           pop eax               ; restore x 
  308.           pop ebx               ; restore y
  309.           pop esi               ; point back to Heightmap
  310.              jmp @@DoSliver
  311.                   
  312. @@NoShadow:
  313.           
  314.               jmp $+2                ; clear prefetch queue
  315.  
  316.               mov eax,_x            ; x
  317.               mov ebx,_y            ; y
  318.               mov ecx,_z            ; z
  319.           xor edx,edx           ; ph
  320.  
  321. @@DoSliver2:                        
  322.               
  323.               cmp edx,_DEPTHCLIP              
  324.              jge @@TheEnd
  325.               add eax,_dx
  326.               add ebx,_dy
  327.               add ecx,_dz
  328.               add edx,_kVScale
  329.           mov ebp,ebx
  330.           shr ebp,23
  331.           shld ebp,eax,9
  332.           mov edi,DWORD PTR [ esi+ebp*4 ]
  333.           cmp edi,ecx
  334.           jle @@DoSliver2
  335.               push esi
  336.           push ebx                        
  337.           push eax                         ; need reg --> if only intel had more!
  338.               mov esi,_Colormap   
  339.           mov bl,BYTE PTR [ esi+ebp ]
  340.           mov ebp,edi                      ; ebp holds height
  341.               mov edi,_Buffer   
  342.               mov esi,_pixel
  343.               mov eax,_dz
  344.                               
  345. @@ReplicateColor2:                                   
  346.  
  347.               add eax,_kVScale                 ; dz+=kVScale
  348.               mov BYTE PTR [ edi+esi ],bl     
  349.               add ecx,edx                      ; z+=ph
  350.               sub esi,_SCREENW                 ; pixel-=SCREENWIDTH     
  351.               cmp esi,0                        ; pixel position < 0      
  352.           jge  @@PassOver2
  353.               pop eax
  354.           pop ebx
  355.           pop esi
  356.           jmp @@TheEnd
  357.           
  358. @@PassOver2:
  359.           
  360.               cmp ebp,ecx
  361.               jg  @@ReplicateColor2             
  362.               mov _dz,eax
  363.               mov _pixel,esi
  364.           pop eax
  365.           pop ebx
  366.           pop esi
  367.              jmp @@DoSliver2
  368.  
  369. @@TheEnd:
  370.            
  371.           pop ebp
  372.           pop edi
  373.           pop esi
  374.  
  375.           cld          
  376.               ret
  377.           
  378. CastRay ENDP
  379. _TEXT            ENDS
  380.  
  381.         END
  382.